
const fs = require("fs")
const babelParser = require("@babel/Parser")
const traverse = require('@babel/traverse').default
const path = require("path")
const {transformFromAst} = require('@babel/core')

const parser = {
  // 将文件解析成ast
    getAst(filepath) {
      //  读取文件
      const file =  fs.readFileSync(filepath, 'utf-8')  // utf-8 是为了转换成文本文件.使其能够转换成 AST
      // 1  将其解析成ast 抽象语法树
      // 借助babel 工具   @babel/parser    Babel.Parser.parse(code,[options])
      const ast =  babelParser.parse(file,{
        sourceType: 'module' // 解析成 ES module
      })

      return ast
    },
    //  获取依赖
    getDeps(ast,filepath){
      //  获取文件夹路径
      const dirname = path.dirname(filepath)
      // 定义存储依赖的容器
      const deps = {}
      // 收集依赖
      traverse(ast, {
        // 内部会遍历ast中的 program.body, 判断里面语句类型
        // 如果 type 是ImportDeclaration  就会触发当前函数
        ImportDeclaration ({node}){
          // 文件相对路径  './add.js'
          const relativepath = node.source.value
          // 生成基于入口文件的绝对路径
          const absolutepath = path.resolve(dirname, relativepath)
          // 添加依赖
          deps[relativepath] = absolutepath
        }
      })
      return deps
    },

    // 将ast 解析成 code
    getCode(ast) {
      // 解析编译代码,讲代码中浏览器不能识别的语法进行编译
      const {code} =  transformFromAst(ast,null,{
        presets: ['@babel/preset-env']
      })
  
      return code
    }
}


module.exports = parser